package modele;

import java.io.Serializable;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;

public class Utilisateur implements Serializable, Comparable {
	private String pseudo;
	private String mdp;
	private int nbPts;
	private ArrayList<Pronostique> listePronostique;
	private boolean admin = false;
	private int NB_MATCH_STAT = 3;
	
	public Utilisateur(String pseudo, String mdp, int nbPts, boolean admin) {
		this(pseudo, mdp, nbPts);
		this.admin = admin;
		listePronostique = new ArrayList<Pronostique>();
	}
	
	public Utilisateur(String pseudo, String mdp, int nbPts) {
		this.pseudo = pseudo;
		this.mdp = mdp;
		this.nbPts = nbPts;
		listePronostique = new ArrayList<Pronostique>();
	}
	
	public String getPseudo() {
		return pseudo;
	}
	
	public void setPseudo(String pseudo) {
		this.pseudo = pseudo;
	}
	
	public String getMdp() {
		return mdp;
	}
	
	public void setMdp(String mdp) {
		this.mdp = mdp;
	}
	
	public int getNbPts() {
		return nbPts;
	}
	
	public void setNbPts(int nbPts) {
		this.nbPts = nbPts;
	}
	
	public ArrayList<Pronostique> getListePronostique() {
		return listePronostique;
	}
	
	public void removeList()
	{
		listePronostique.removeAll(listePronostique);
	}
	public void setListePronostique(ArrayList<Pronostique> listePronostique) {
		

		
		boolean trouve=false;
		if(this.listePronostique.size() == 0)
			this.listePronostique.addAll(listePronostique);
		else {
			for(Pronostique newProno : listePronostique) {
				
				Match m1 = newProno.getMatch();

				Iterator<Pronostique> it = this.listePronostique.iterator();
				while(it.hasNext()){
					Pronostique prono = it.next();
					Match m = prono.getMatch();

					if(m.getEquipe1().getNom().equals(m1.getEquipe1().getNom())
						&& m.getEquipe2().getNom().equals(m1.getEquipe2().getNom())
						&& m.getDate().equals(m1.getDate())) {
						prono.setScoreEquipe1(newProno.getScoreEquipe1());
						prono.setScoreEquipe2(newProno.getScoreEquipe2());
						trouve = true;
					}
				}
				if(trouve)
					break;
				else
				{
					this.listePronostique.add(newProno);
				}
			}
		}
	}
	
	public String getStatsDixMatchs() {
		int nbPerfect =0;
		int nbBonProno =0;
		int nbFail=0;
		int nbProno=0;
		int cpt=0;
		DecimalFormat f = new DecimalFormat();
		f.setMaximumFractionDigits(2);
		
		if(listePronostique.size() >0) {
			System.out.println(listePronostique.size());
			for(int i=listePronostique.size()-1; i>=0 && cpt < NB_MATCH_STAT; i--)
			{
				Pronostique prono = listePronostique.get(i);
				Date dateNow = new Date();
				if(prono.getMatch().getDate().before(dateNow)) {
			
					if(prono.getPtObtenus() == 3) {
						nbPerfect++;
					}
					else if(prono.getPtObtenus() == 1) {
						nbBonProno++;
					}
					else if(prono.getPtObtenus() == 0) {
						nbFail++;
					}
					
					cpt++;
				}
			}
			
			nbProno = nbPerfect + nbBonProno + nbFail;
			if(nbProno ==0)
				return "Pas de matchs"; 
			return "<html>Bon score: "+nbPerfect+" ("+ (f.format((double)(nbPerfect)/(double)(nbProno)*100)) +"%)<br>"+
					"Bon résultat: "+nbBonProno+" ("+ (f.format((double)(nbBonProno)/(double)(nbProno)*100)) +"%)<br>"+
					"Mauvais résultat: "+nbFail+" ("+ (f.format((double)(nbFail)/(double)(nbProno)*100)) +"%)<br>"+
					"Points: "+ (nbPerfect*3 + nbBonProno*1)+"</html>";
		}
		return "Pas de matchs";
	}
	
	public String getStatsGeneral() {
		int nbPerfect =0;
		int nbBonProno =0;
		int nbFail=0;
		int nbProno=0;
		int numJournee=0;
		DecimalFormat f = new DecimalFormat();
		f.setMaximumFractionDigits(2);
		if(listePronostique.size() !=0) {
			for(int i=listePronostique.size()-1; i>=0; i--)
			{
				Date dateNow = new Date();
				Pronostique prono = listePronostique.get(i);

				if(prono.getMatch().getDate().before(dateNow)) {
					
					if(prono.getPtObtenus() == 3) {
						nbPerfect++;
					}
					else if(prono.getPtObtenus() == 1) {
						nbBonProno++;
					}
					else if(prono.getPtObtenus() == 0) {
						nbFail++;
					}
				}
				
			}
			
			nbProno = nbPerfect + nbBonProno + nbFail;
			

			if(nbProno == 0)
				return "Pas de pronostique passé";
			else
				return "<html>Bon score: "+nbPerfect+" ("+ (f.format((double)(nbPerfect)/(double)(nbProno)*100)) +"%)<br>"+
				"Bon résultat: "+nbBonProno+" ("+ (f.format((double)(nbBonProno)/(double)(nbProno)*100)) +"%)<br>"+
				"Mauvais résultat: "+nbFail+" ("+ (f.format((double)(nbFail)/(double)(nbProno)*100)) +"%)<br>"+
				"Points: "+ (nbPerfect*3 + nbBonProno*1)+"</html>";
		}
		return "Pas de pronostique joué";
	}

	public int compareTo(Object user) {
		return ((Utilisateur)user).getNbPts() - this.getNbPts();
	}

	public boolean isAdmin() {
		return admin;
	}
	public void setAdmin(boolean admin) {
		this.admin = admin;
	}

}
